home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / src / Rkm_asm.lha / Assembly_Codes / OS_Sources / Devices / Printer.s < prev    next >
Text File  |  1992-09-02  |  16KB  |  889 lines

  1.  
  2.  * This code shows how to determine the state of the printer (off/online,
  3.  * paper in/out and busy/not busy) and allows basic printing of text via
  4.  * the following keys:
  5.  *
  6.  * a = Reset the printer
  7.  * b = Printer.Device print
  8.  * c = Parallel.Device print
  9.  *
  10.  * This code was tested on my old Epson RX80 parallel printer (still Alive!).
  11.  
  12.     INCDIR    WORK:Include/
  13.  
  14.     INCLUDE    exec/exec_lib.i
  15.     INCLUDE    exec/memory.i
  16.     INCLUDE    intuition/intuition_lib.i
  17.     INCLUDE    intuition/intuition.i
  18.     INCLUDE dos/dos_lib.i
  19.     INCLUDE dos/dos.i
  20.     INCLUDE dos/dosextens.i
  21.     INCLUDE    graphics/graphics_lib.i
  22.     INCLUDE    graphics/text.i
  23.     INCLUDE    workbench/icon_lib.i
  24.     INCLUDE    workbench/startup.i
  25.     INCLUDE    workbench/workbench.i
  26.     INCLUDE    devices/parallel.i
  27.     INCLUDE    devices/printer.i
  28.     INCLUDE    devices/prtbase.i
  29.     INCLUDE    devices/prtgfx.i
  30.  
  31. LIB_VER        EQU    39
  32. TRUE        EQU    -1
  33. FALSE        EQU    0
  34.  
  35.     lea    membuf(pc),a4
  36.  
  37.  * membuf (Memory Buffer) is set-up so that this code can be
  38.  * position-independant. The memory buffer contains the following
  39.  * addresses and their data:
  40.  *
  41.  *   0  Startup Return Message
  42.  *   4  _DOSBase
  43.  *   8  _IntuitionBase
  44.  *  12 _IconBase
  45.  *  16 Old Directory from CurrentDir()
  46.  *  20 Disk Object from GetDiskObject()
  47.  *  24 Argument addresses (30*4)
  48.  * 144 ReadArgs() return value
  49.  * 148 Task address
  50.  * 152 _GfxBase
  51.  * 156 window rastport
  52.  * 160 viewport
  53.  * 164
  54.  * 165
  55.  * 166 Memory Buffer (12 bytes)
  56.  * 178 window
  57.  * 182 value 1 (for ToolType/CLI result)
  58.  * 183 value 2 (for ToolType/CLI result)
  59.  * 184 screen rastport
  60.  * 188 iclass
  61.  * 192 icode
  62.  * 194 iqualifier
  63.  * 196 iaddress
  64.  * 200 mousex
  65.  * 202 mousey
  66.  * 204 screen
  67.  * 208 colourmap
  68.  * 212 printer status
  69.  * 216 userport
  70.  * 220
  71.  
  72.  * The Startup code below reads two CLI Arguments/WB ToolTypes as an example
  73.  * of how to programme CLI Arguments/WB ToolTypes.
  74.  *
  75.  * Note: The CLI Arguments/WB ToolTypes are done after Startup and Library
  76.  *       opening, so there is no use for the A0 pointer (which contains
  77.  *       pr_CLI).
  78.  
  79.     suba.l    a1,a1
  80.     move.l    4.w,a6
  81.     jsr    _LVOFindTask(a6)
  82.     tst.l    d0
  83.     beq    exit
  84.     move.l    d0,a5
  85.     move.l    a5,148(a4)
  86.     tst.l    pr_CLI(a5)        ; Was this task started from CLI?
  87.     bne.s    _main            ; Yes.
  88.     lea    pr_MsgPort(a5),a0    ; No. From Workbench.
  89.     jsr    _LVOWaitPort(a6)
  90.     lea    pr_MsgPort(a5),a0
  91.     jsr    _LVOGetMsg(a6)
  92.     move.l    d0,(a4)            ; D0 = A WBStartup Message.
  93.  
  94. _main
  95.     moveq    #LIB_VER,d0
  96.         lea     dos_name(pc),a1
  97.     move.l    4.w,a6
  98.         jsr    _LVOOpenLibrary(a6)
  99.         move.l  d0,4(a4)
  100.         beq     quit
  101.  
  102.         moveq    #LIB_VER,d0
  103.         lea     int_name(pc),a1
  104.         jsr    _LVOOpenLibrary(a6)
  105.         move.l  d0,8(a4)
  106.         beq     cl_dos
  107.  
  108.         moveq    #LIB_VER,d0
  109.         lea     gfx_name(pc),a1
  110.         jsr    _LVOOpenLibrary(a6)
  111.         move.l  d0,152(a4)
  112.         beq     cl_int
  113.  
  114.         moveq    #LIB_VER,d0
  115.         lea     icon_name(pc),a1
  116.         jsr    _LVOOpenLibrary(a6)
  117.         move.l  d0,12(a4)
  118.         beq     cl_gfx
  119.  
  120.  * Check the ToolTypes/CLI Arguments.
  121.  
  122.         move.l    (a4),a0
  123.         tst.l   a0
  124.         beq    fromcli
  125.     move.l    sm_ArgList(a0),a5
  126.         move.l  (a5),d1
  127.     beq    zero_args
  128.     move.l    4(a4),a6
  129.     jsr    _LVOCurrentDir(a6)
  130.         move.l  d0,16(a4)
  131.         move.l    wa_Name(a5),a0
  132.     move.l    12(a4),a6
  133.     jsr    _LVOGetDiskObject(a6)
  134.         move.l  d0,20(a4)
  135.         beq     zero_args
  136.         move.l    d0,a5
  137.         move.l  do_ToolTypes(a5),a5
  138.  
  139.     move.l    a5,a0
  140.         lea    ftstg0(pc),a1
  141.         jsr    _LVOFindToolType(a6)
  142.     tst.l    d0
  143.         beq.s    tt1
  144.     move.l    d0,a3
  145.     move.l    a3,a0
  146.     lea    mtstg0(pc),a1
  147.     jsr    _LVOMatchToolValue(a6)
  148.     tst.l    d0
  149.     beq.s    tto1
  150.     clr.b    182(a4)
  151.     bra.s    tt1
  152. tto1    move.l    a3,a0
  153.     lea    mtstg1(pc),a1
  154.     jsr    _LVOMatchToolValue(a6)
  155.     tst.l    d0
  156.     beq.s    tt1
  157.     move.b    #1,182(a4)
  158. tt1    move.l    a5,a0
  159.         lea    ftstg1(pc),a1
  160.         jsr    _LVOFindToolType(a6)
  161.     tst.l    d0
  162.         beq.s    tt2
  163.     move.l    d0,a3
  164.     move.l    a3,a0
  165.     lea    mtstg2(pc),a1
  166.     jsr    _LVOMatchToolValue(a6)
  167.     tst.l    d0
  168.     beq.s    tto2
  169.     clr.b    183(a4)
  170.     bra.s    tt2
  171. tto2    move.l    a3,a0
  172.     lea    mtstg3(pc),a1
  173.     jsr    _LVOMatchToolValue(a6)
  174.     tst.l    d0
  175.     beq.s    tto3
  176.     move.b    #1,183(a4)
  177.     bra.s    tt2
  178. tto3    move.l    a3,a0
  179.     lea    mtstg4(pc),a1
  180.     jsr    _LVOMatchToolValue(a6)
  181.     tst.l    d0
  182.     beq.s    tto4
  183.     move.b    #2,183(a4)
  184.     bra.s    tt2
  185. tto4    move.l    a3,a0
  186.     lea    mtstg5(pc),a1
  187.     jsr    _LVOMatchToolValue(a6)
  188.     tst.l    d0
  189.     beq.s    tt2
  190.     move.b    #3,183(a4)
  191. tt2
  192.     nop
  193.  
  194.  
  195. free_diskobj
  196.         move.l    20(a4),a0
  197.         jsr    _LVOFreeDiskObject(a6)
  198.     bra    zero_args
  199.  
  200. fromcli    lea    template(pc),a0
  201.     move.l  a0,d1
  202.         lea    24(a4),a5
  203.         move.l  a5,d2
  204.         moveq    #0,d3
  205.     move.l    4(a4),a6
  206.         jsr    _LVOReadArgs(a6)
  207.         move.l  d0,144(a4)
  208.         beq    zero_args
  209.  
  210.     move.l    (a5),a0
  211.     lea    mtstg0(pc),a1
  212.     bsr    cmpbyte
  213.     tst.l    d0
  214.     bne.s    cao1
  215.     clr.b    182(a4)
  216.     bra.s    ca1
  217. cao1    move.l    (a5),a0
  218.     lea    mtstg1(pc),a1
  219.     bsr    cmpbyte
  220.     tst.l    d0
  221.     bne.s    ca1
  222.     move.b    #1,182(a4)
  223. ca1    move.l    4(a5),a0
  224.     lea    mtstg2(pc),a1
  225.     bsr    cmpbyte
  226.     tst.l    d0
  227.     bne.s    cao2
  228.     clr.b    183(a4)
  229.     bra.s    ca2
  230. cao2    move.l    4(a5),a0
  231.     lea    mtstg3(pc),a1
  232.     bsr    cmpbyte
  233.     tst.l    d0
  234.     bne.s    cao3
  235.     move.b    #1,183(a4)
  236.     bra.s    ca2
  237. cao3    move.l    4(a5),a0
  238.     lea    mtstg4(pc),a1
  239.     bsr    cmpbyte
  240.     tst.l    d0
  241.     bne.s    cao4
  242.     move.b    #2,183(a4)
  243.     bra.s    ca2
  244. cao4    move.l    4(a5),a0
  245.     lea    mtstg5(pc),a1
  246.     bsr    cmpbyte
  247.     tst.l    d0
  248.     bne.s    ca2
  249.     move.b    #3,183(a4)
  250. ca2
  251.     nop
  252.  
  253.  
  254. free_cliargs
  255.         move.l    144(a4),d1
  256.         jsr    _LVOFreeArgs(a6)
  257.  
  258. zero_args
  259.  
  260.     suba.l    a0,a0
  261.     lea    scrntags(pc),a1
  262.     move.l    8(a4),a6
  263.     jsr    _LVOOpenScreenTagList(a6)
  264.     move.l    d0,wndwscrn
  265.     beq    cl_icon
  266.  
  267.     suba.l    a0,a0
  268.     lea    wndwtags(pc),a1
  269.     jsr    _LVOOpenWindowTagList(a6)
  270.     move.l    d0,178(a4)
  271.     beq    cl_scrn
  272.  
  273.     move.l    178(a4),a0
  274.     move.l    wd_RPort(a0),156(a4)
  275.     move.l    wndwscrn(pc),a0
  276.     lea    sc_RastPort(a0),a1
  277.     move.l    a1,184(a4)
  278.     lea    sc_ViewPort(a0),a0
  279.     move.l    a0,160(a4)
  280.  
  281. msg_l    move.l    178(a4),a0
  282.     move.l    wd_UserPort(a0),a0
  283.     move.l    4.w,a6
  284.     jsr    _LVOWaitPort(a6)
  285.     move.l    178(a4),a0
  286.     move.l    wd_UserPort(a0),a0
  287.     jsr    _LVOGetMsg(a6)
  288.     move.l    d0,a1
  289.     move.l    im_Class(a1),188(a4)
  290.     move.w    im_Code(a1),192(a4)
  291.     move.w    im_Qualifier(a1),194(a4)
  292.     move.l    im_IAddress(a1),196(a4)
  293.     move.w    im_MouseX(a1),200(a4)
  294.     move.w    im_MouseY(a1),202(a4)
  295.     jsr    _LVOReplyMsg(a6)
  296.  
  297.     cmp.l    #IDCMP_VANILLAKEY,188(a4)
  298.     beq    which_vanillakey
  299.  
  300.     cmp.l    #IDCMP_CLOSEWINDOW,188(a4)
  301.     beq.s    cl_wndw
  302.  
  303.     bra.s    msg_l
  304.  
  305.  
  306. cl_wndw    move.l    178(a4),a0
  307.     move.l    8(a4),a6
  308.     jsr    _LVOCloseWindow(a6)
  309.  
  310. cl_scrn    move.l    wndwscrn(pc),a0
  311.     move.l    8(a4),a6
  312.     jsr    _LVOCloseScreen(a6)
  313.  
  314. cl_icon    move.l  12(a4),a1
  315.     move.l    4.w,a6
  316.         jsr    _LVOCloseLibrary(a6)
  317.  
  318. cl_gfx    move.l  152(a4),a1
  319.     move.l    4.w,a6
  320.         jsr    _LVOCloseLibrary(a6)
  321.  
  322. cl_int    move.l  8(a4),a1
  323.     move.l    4.w,a6
  324.         jsr    _LVOCloseLibrary(a6)
  325.  
  326. cl_dos    move.l  4(a4),a1
  327.     move.l    4.w,a6
  328.         jsr    _LVOCloseLibrary(a6)
  329.  
  330. quit    move.l  #8000000,d0
  331.         moveq    #MEMF_CHIP,d1
  332.     move.l    4.w,a6
  333.     jsr    _LVOAllocMem(a6)
  334.     tst.l    d0
  335.     beq.s    cleanup
  336.     move.l    d0,a1
  337.     move.l    #8000000,d0
  338.     jsr    _LVOFreeMem(a6)
  339. cleanup    tst.l    (a4)
  340.     beq.s    exit            ; Exit - Task was started from CLI.
  341.     move.l    4.w,a6
  342.     jsr    _LVOForbid(a6)
  343.     move.l    (a4),a1            ; Reply to the WB Startup Message and
  344.     jsr    _LVOReplyMsg(a6)    ; Exit - Task was started from WB.
  345. exit    moveq    #0,d0
  346.     rts
  347.  
  348.  
  349.  * Branch-To Routines.
  350.  
  351. which_vanillakey
  352.     move.w    192(a4),d0
  353.     cmp.w    #$61,d0
  354.     beq.s    setcmd_printer
  355.     cmp.w    #$62,d0
  356.     beq    prtext_printer
  357.     cmp.w    #$63,d0
  358.     beq    parallel_printer
  359.     bra    msg_l
  360.  
  361.  
  362.  * Sub-Routines.
  363.  
  364. setcmd_printer
  365.     move.l    4.w,a6
  366.     jsr    _LVOCreateMsgPort(a6)
  367.     move.l    d0,prtport
  368.     beq    no_prt
  369.     move.l    d0,a0
  370.     moveq.l    #iopcr_SIZEOF,d0
  371.     jsr    _LVOCreateIORequest(a6)
  372.     move.l    d0,prtio
  373.     beq    cl_prtport
  374.     move.l    d0,a1
  375.     move.l    #PARF_SHARED,IO_FLAGS(a1)
  376.     lea    prt_name(pc),a0
  377.     moveq    #0,d0
  378.     moveq    #0,d1
  379.     jsr    _LVOOpenDevice(a6)
  380.     tst.l    d0
  381.     bne    cl_prtio
  382.  
  383.  * This next code just cancels any printer commands (commands sequences) I
  384.  * used inside my prtbuf text. You should cancel/change your settings, as
  385.  * need be, if your next text to be printed is raw text (as opposed to a
  386.  * text buffer/string with command sequences inside it).
  387.  
  388.     move.l    prtio(pc),a1
  389.     move.w    #aRIS,io_PrtCommand(a1)        ; RESET command.
  390.     move.b    #27,io_Parm0(a1)        ; Esc
  391.     move.b    #99,io_Parm1(a1)        ; Ascii c
  392.     move.b    #0,io_Parm2(a1)
  393.     move.b    #0,io_Parm3(a1)
  394.     move.w    #PRD_PRTCOMMAND,IO_COMMAND(a1)
  395.     move.l    4.w,a6
  396.     jsr    _LVODoIO(a6)
  397.  
  398.     move.l    prtio(pc),a1
  399.     move.w    #aSGR0,io_PrtCommand(a1)    ; NORMAL Character Set
  400.     move.b    #27,io_Parm0(a1)        ; Esc
  401.     move.b    #91,io_Parm1(a1)        ; [
  402.     move.b    #48,io_Parm2(a1)        ; Ascii 0
  403.     move.b    #109,io_Parm3(a1)        ; Ascii m
  404.     move.w    #PRD_PRTCOMMAND,IO_COMMAND(a1)
  405.     jsr    _LVODoIO(a6)
  406.  
  407.  * Note: The above commands are needed by the following commands in order to
  408.  *       work (on my Epson RX80 at least).
  409.  
  410.     move.l    prtio(pc),a1
  411.     move.w    #aSGR3,io_PrtCommand(a1)    ; ITALICS ON command.
  412.     move.b    #27,io_Parm0(a1)        ; Esc
  413.     move.b    #91,io_Parm1(a1)        ; [
  414.     move.b    #51,io_Parm2(a1)        ; Ascii 3
  415.     move.b    #109,io_Parm3(a1)        ; Ascii m
  416.     move.w    #PRD_PRTCOMMAND,IO_COMMAND(a1)
  417.     jsr    _LVODoIO(a6)
  418.  
  419.     move.l    prtio(pc),a1
  420.     move.w    #aSGR4,io_PrtCommand(a1)    ; BOLD ON command.
  421.     move.b    #27,io_Parm0(a1)        ; Esc
  422.     move.b    #91,io_Parm1(a1)        ; [
  423.     move.b    #49,io_Parm2(a1)        ; Ascii 1
  424.     move.b    #109,io_Parm3(a1)        ; Ascii m
  425.     move.w    #PRD_PRTCOMMAND,IO_COMMAND(a1)
  426.     jsr    _LVODoIO(a6)
  427.  
  428.     bra.s    cl_prtdev
  429.  
  430. prt_error
  431.     nop
  432.  
  433. cl_prtdev
  434.     movea.l    prtio(pc),a1
  435.     move.l    4.w,a6
  436.     jsr    _LVOCloseDevice(a6)
  437.  
  438. cl_prtio
  439.     movea.l    prtio(pc),a0
  440.     move.l    4.w,a6
  441.     jsr    _LVODeleteIORequest(a6)
  442.  
  443. cl_prtport
  444.     movea.l    prtport(pc),a0
  445.     move.l    4.w,a6
  446.     jsr    _LVODeleteMsgPort(a6)
  447.     bra.s    prt_end
  448. no_prt
  449.     nop
  450. prt_end    bra    msg_l
  451.  
  452. prt_sendio
  453.     move.l    a3,a1
  454.     move.l    4.w,a6
  455.     jsr    _LVOSendIO(a6)
  456.     move.l    a3,a1
  457.     jsr    _LVOWaitIO(a6)
  458.         tst.l    d0
  459.         beq.s    psio_e
  460.     move.b    IO_ERROR(a3),prterr
  461. psio_e    rts
  462.  
  463. prt_doio
  464.     move.l    a3,a1
  465.     move.l    4.w,a6
  466.     jsr    _LVODoIO(a6)
  467.         tst.l    d0
  468.         bne.s    pdio_e
  469.     clr.b    prterr
  470.     move.l    IO_ACTUAL(a3),216(a4)
  471. pdio_e    rts
  472.  
  473. prtext_printer
  474.     move.l    4.w,a6
  475.     jsr    _LVOCreateMsgPort(a6)
  476.     move.l    d0,prtextport
  477.     beq    no_prtext
  478.     move.l    d0,a0
  479.     moveq.l    #IOSTD_SIZE,d0
  480.     jsr    _LVOCreateIORequest(a6)
  481.     move.l    d0,prtextio
  482.     beq    cl_prtextport
  483.     move.l    d0,a1
  484.     move.l    #PARF_SHARED,IO_FLAGS(a1)
  485.     lea    prt_name(pc),a0
  486.     moveq    #0,d0
  487.     moveq    #0,d1
  488.     jsr    _LVOOpenDevice(a6)
  489.     tst.l    d0
  490.     bne    cl_prtextio
  491.  
  492.     move.l    prtextio(pc),a3
  493.     move.w    #PRD_QUERY,IO_COMMAND(a3)
  494.     lea    212(a4),a0
  495.     move.l    a0,IO_DATA(a3)
  496.     bsr.s    prt_doio
  497.     lea    212(a4),a0
  498.     tst.l    (a0)
  499.     beq    printer_end
  500.     move.l    216(a4),d0
  501.     cmp    #1,d0            ; Is it the Parallel Port?
  502.     beq.s    userport1        ; Yes.
  503.     cmp    #2,d0            ; No. Is it the Serial Port?
  504.     beq    userport2        ; Yes.
  505.     bra    userport_unknown    ; No. So exit - Port unknown.
  506.  
  507. userport1
  508.     move.w    #16,d0
  509.     move.w    #26,d1
  510.     move.l    156(a4),a1
  511.     move.l    152(a4),a6
  512.     jsr    _LVOMove(a6)
  513.     lea    212(a4),a0
  514.     move.l    (a0),d3
  515.     clr.w    d3            ; Clear serial data.
  516.     swap    d3            ; Put prt status data into low word.
  517.     btst    #8,d3
  518.     bne    prt_offline
  519.     move.l    #on_line,a0
  520.     moveq    #11,d0
  521.     move.l    156(a4),a1
  522.     jsr    _LVOText(a6)
  523.     move.w    #16,d0
  524.     move.w    #36,d1
  525.     move.l    156(a4),a1
  526.     jsr    _LVOMove(a6)
  527.     btst    #9,d3
  528.     bne.s    prt_paperout
  529.     move.l    #paper_in,a0
  530.     moveq    #11,d0
  531.     move.l    156(a4),a1
  532.     jsr    _LVOText(a6)
  533.     btst    #10,d3
  534.     beq.s    prt_busy
  535.     move.w    #16,d0
  536.     move.w    #46,d1
  537.     move.l    156(a4),a1
  538.     jsr    _LVOMove(a6)
  539.     move.l    #not_busy,a0
  540.     moveq    #11,d0
  541.     move.l    156(a4),a1
  542.     jsr    _LVOText(a6)
  543.     bra.s    userport_end
  544.  
  545. userport2
  546.  
  547.  * Serial Printer status.
  548.  
  549.     bra.s    userport_end
  550.  
  551. userport_unknown
  552.     nop
  553.  
  554. userport_end
  555.  
  556.     move.l    prtextio(pc),a3
  557.     move.l    #prtbuf,IO_DATA(a3)
  558.     move.l    #prtlen,IO_LENGTH(a3)
  559.     move.w    #CMD_WRITE,IO_COMMAND(a3)
  560.     bsr    prt_sendio
  561.     tst.b    prterr
  562.     bne.s    prtext_error
  563.     bra.s    printer_end
  564.  
  565. prt_offline
  566.     move.l    #off_line,a0
  567.     moveq    #11,d0
  568.     move.l    156(a4),a1
  569.     jsr    _LVOText(a6)
  570.     bra.s    printer_end
  571.  
  572. prt_paperout
  573.     move.l    #paper_out,a0
  574.     moveq    #11,d0
  575.     move.l    156(a4),a1
  576.     jsr    _LVOText(a6)
  577.     bra.s    printer_end
  578.  
  579. prt_busy
  580.     move.l    #busy,a0
  581.     moveq    #11,d0
  582.     move.l    156(a4),a1
  583.     jsr    _LVOText(a6)
  584.  
  585. printer_end
  586.     nop
  587.     bra.s    cl_prtextdev
  588.  
  589. prtext_error
  590.     nop
  591.  
  592. cl_prtextdev
  593.     movea.l    prtextio(pc),a1
  594.     move.l    4.w,a6
  595.     jsr    _LVOCloseDevice(a6)
  596.  
  597. cl_prtextio
  598.     movea.l    prtextio(pc),a0
  599.     move.l    4.w,a6
  600.     jsr    _LVODeleteIORequest(a6)
  601.  
  602. cl_prtextport
  603.     movea.l    prtextport(pc),a0
  604.     move.l    4.w,a6
  605.     jsr    _LVODeleteMsgPort(a6)
  606.     bra.s    prtext_end
  607. no_prtext
  608.     nop
  609. prtext_end
  610.     bra    msg_l
  611.  
  612. parallel_printer
  613.     move.l    4.w,a6
  614.     jsr    _LVOCreateMsgPort(a6)
  615.     move.l    d0,parport
  616.     beq    no_par
  617.     move.l    d0,a0
  618.     moveq.l    #IOEXTPar_SIZE,d0
  619.     jsr    _LVOCreateIORequest(a6)
  620.     move.l    d0,pario
  621.     beq    cl_parport
  622.     move.l    d0,a1
  623.     move.l    #PARF_SHARED,IO_FLAGS(a1)
  624.     lea    par_name(pc),a0
  625.     moveq    #0,d0
  626.     moveq    #0,d1
  627.     jsr    _LVOOpenDevice(a6)
  628.     tst.l    d0
  629.     bne    cl_pario
  630.  
  631.     move.l    pario(pc),a1
  632.     move.w    #PDCMD_QUERY,IO_COMMAND(a1)
  633.     jsr    _LVOSendIO(a6)
  634.     move.l    pario(pc),a1
  635.     move.b    IO_PARSTATUS(a1),parsts
  636.     jsr    _LVOWaitIO(a6)
  637.         tst.l    d0
  638.         bne    par_error
  639.  
  640.     moveq    #0,d3
  641.     move.b    parsts,d3
  642.     btst    #0,d3
  643.     bne.s    par_offline
  644.     btst    #1,d3
  645.     bne.s    par_paperout
  646.     btst    #2,d3
  647.     beq.s    par_busy
  648.  
  649.     move.l    pario(pc),a1
  650.     move.l    #parbuf,IO_DATA(a1)
  651.     move.l    #parlen,IO_LENGTH(a1)
  652.     move.w    #CMD_WRITE,IO_COMMAND(a1)
  653.     jsr    _LVOSendIO(a6)
  654.     move.l    pario(pc),a1
  655.     jsr    _LVOWaitIO(a6)
  656.         tst.l    d0
  657.         bne.s    par_error
  658.     bra.s    cl_pardev
  659.  
  660. par_offline
  661.     move.w    #16,d0
  662.     move.w    #26,d1
  663.     move.l    156(a4),a1
  664.     move.l    152(a4),a6
  665.     jsr    _LVOMove(a6)
  666.     move.l    #off_line,a0
  667.     moveq    #11,d0
  668.     move.l    156(a4),a1
  669.     jsr    _LVOText(a6)
  670.     bra.s    cl_pardev
  671.  
  672. par_paperout
  673.     move.w    #16,d0
  674.     move.w    #36,d1
  675.     move.l    156(a4),a1
  676.     move.l    152(a4),a6
  677.     jsr    _LVOMove(a6)
  678.     move.l    #paper_out,a0
  679.     moveq    #11,d0
  680.     move.l    156(a4),a1
  681.     jsr    _LVOText(a6)
  682.     bra.s    cl_pardev
  683.  
  684. par_busy
  685.     move.w    #16,d0
  686.     move.w    #46,d1
  687.     move.l    156(a4),a1
  688.     move.l    152(a4),a6
  689.     jsr    _LVOMove(a6)
  690.     move.l    #busy,a0
  691.     moveq    #11,d0
  692.     move.l    156(a4),a1
  693.     jsr    _LVOText(a6)
  694.     bra.s    cl_pardev
  695.  
  696. par_error
  697.     nop
  698.  
  699. cl_pardev
  700.     movea.l    pario(pc),a1
  701.     move.l    4.w,a6
  702.     jsr    _LVOCloseDevice(a6)
  703.  
  704. cl_pario
  705.     movea.l    pario(pc),a0
  706.     move.l    4.w,a6
  707.     jsr    _LVODeleteIORequest(a6)
  708.  
  709. cl_parport
  710.     movea.l    parport(pc),a0
  711.     move.l    4.w,a6
  712.     jsr    _LVODeleteMsgPort(a6)
  713.     bra.s    par_end
  714. no_par
  715.     nop
  716. par_end    bra    msg_l
  717.  
  718. cmpbyte    move.b  (a0)+,d0
  719.         move.b  (a1)+,d1
  720.         tst.b   d0
  721.         beq.s   byte0
  722.         cmp.b   d1,d0
  723.         beq.s   cmpbyte
  724. byte0    sub.b   d1,d0
  725.         ext.w   d0
  726.         ext.l   d0
  727.         rts
  728.  
  729. findlen    move.l    a0,a1
  730.     moveq    #0,d0
  731. not_nil    tst.b    (a1)+
  732.     beq.s    gotlen
  733.     addq.l    #1,d0
  734.     bra.s    not_nil
  735. gotlen    rts
  736.  
  737. convert_number
  738.     lea    166(a4),a0
  739.     move.l    d1,d7
  740.     bsr.s    word_to_ascii
  741.     clr.l    (a0)
  742.     rts
  743.  
  744. word_to_ascii
  745.     move.b    #48,(a0)
  746.     moveq    #0,d1
  747.     move.w    d7,d1
  748.     divu    #1000,d1
  749.     and.l    #$0000FFFF,d1
  750.     divu    #10,d1
  751.     bsr.s    do_val
  752.     bsr.s    do_val
  753.     moveq    #0,d1
  754.     move.w    d7,d1
  755.     divu    #1000,d1
  756.     clr.w    d1
  757.     swap    d1
  758.     divu    #100,d1
  759.     bsr.s    do_val
  760.     divu    #10,d1
  761.     bsr.s    do_val
  762.     bsr.s    do_val
  763.     rts
  764.  
  765. do_val    add.w    #$30,d1
  766.     move.b    d1,(a0)+
  767.     clr.w    d1
  768.     swap    d1
  769.     rts
  770.  
  771.  
  772.  * Structures/Definitions.
  773.  
  774. topaz9
  775.     dc.l    font_name
  776.     dc.w    9
  777.     dc.b    FS_NORMAL,FPF_ROMFONT
  778.  
  779. pens
  780.     dc.l    -1
  781.  
  782. scrntags
  783.     dc.l    SA_Top,0
  784.     dc.l    SA_Left,0
  785.     dc.l    SA_Width,640
  786.     dc.l    SA_Height,256
  787.     dc.l    SA_Depth,2
  788.     dc.l    SA_Pens,pens
  789.     dc.l    SA_DetailPen,0
  790.     dc.l    SA_BlockPen,1
  791.     dc.l    SA_Title,scrn_title
  792.     dc.l    SA_DisplayID,$8000
  793.     dc.l    SA_Type,CUSTOMSCREEN
  794.     dc.l    SA_Font,topaz9
  795.     dc.l    TAG_DONE
  796.  
  797. wndwtags
  798.     dc.l    WA_Top,13
  799.     dc.l    WA_Left,0
  800.     dc.l    WA_Width,640
  801.     dc.l    WA_Height,242
  802.     dc.l    WA_IDCMP,IDCMP_VANILLAKEY!IDCMP_RAWKEY!IDCMP_MOUSEBUTTONS!IDCMP_CLOSEWINDOW
  803.     dc.l    WA_Activate,TRUE
  804.     dc.l    WA_NoCareRefresh,TRUE
  805.     dc.l    WA_SmartRefresh,TRUE
  806.     dc.l    WA_CloseGadget,TRUE
  807.     dc.l    WA_RMBTrap,TRUE
  808.     dc.l    WA_CustomScreen
  809. wndwscrn
  810.     dc.l    0
  811.     dc.l    TAG_DONE
  812.  
  813.  
  814.  * Long Variables.
  815.  
  816. parport        dc.l    0
  817. pario        dc.l    0
  818. prtport        dc.l    0
  819. prtio        dc.l    0
  820. prtextport    dc.l    0
  821. prtextio    dc.l    0
  822.  
  823.  
  824.  * Word Variables.
  825.  
  826. prtcommand    dc.w    0
  827.  
  828.  
  829.  * Byte Variables.
  830.  
  831. param0    dc.b    0
  832. param1    dc.b    0
  833. param2    dc.b    0
  834. param3    dc.b    0
  835. parsts    dc.b    0
  836. prterr    dc.b    0
  837.  
  838.  
  839.  * String Variables.
  840.  
  841. int_name    dc.b    'intuition.library',0
  842. dos_name    dc.b    'dos.library',0
  843. icon_name       dc.b    'icon.library',0,0
  844. gfx_name    dc.b    'graphics.library',0
  845. par_name    dc.b    'parallel.device',0
  846. prt_name    dc.b    'printer.device',0,0
  847. mtstg0        dc.b    'ARG_ONE',0
  848. mtstg1        dc.b    'ARG_TWO',0
  849. mtstg2        dc.b    'ARG_THREE',0
  850. mtstg3        dc.b    'ARG_FOUR',0,0
  851. mtstg4        dc.b    'ARG_FIVE',0,0
  852. mtstg5        dc.b    'ARG_SIX',0
  853. ftstg0          dc.b    'TOOLTYPE_ONE',0,0
  854. ftstg1          dc.b    'TOOLTYPE_TWO',0,0
  855. template    dc.b    'KEYWORD_ONE/K,KEYWORD_TWO/K',0
  856. font_name    dc.b    'topaz.font',0,0
  857. scrn_title    dc.b    'Printer.s',0
  858. error        dc.b    'Error      ',0
  859. on_line        dc.b    'On-Line    ',0
  860. off_line    dc.b    'Not On-Line',0
  861. paper_in    dc.b    'Paper In   ',0
  862. paper_out    dc.b    'Paper Out  ',0
  863. not_busy    dc.b    'Not Busy   ',0
  864. busy        dc.b    'Busy       ',0
  865.  
  866. parbuf
  867.     dc.b    10,'Hello Parallel.Device!!',10
  868.     dc.b    'Are you still working?!',10
  869.     even
  870. parlen    equ    *-parbuf
  871.  
  872. prtbuf
  873.     dc.b    10,27,'c',27,'[1m',27,'[6wHello Printer.Device!!',10
  874.     dc.b    10,'Are you being Bold, Large or both?!',10
  875.     even
  876. prtlen    equ    *-prtbuf
  877.  
  878.  
  879.  * Buffer Variables.
  880.  
  881. membuf        dcb.b    300,0
  882.  
  883.  
  884.     SECTION    VERSION,DATA
  885.  
  886.     dc.b    '$VER: Printer.s V1.01 (22.4.2001)',0
  887.  
  888.  
  889.     END